/*
 * @Descripttion: 用户集合
 * @version:
 * @Author: zheng yiliang
 * @Date: 2021-03-27 13:29:24
 * @LastEditors: zheng yiliang
 * @LastEditTime: 2021-06-11 12:37:30
 */

const mongoose = require('../core/mongodb')
const { Schema, model } = mongoose
const Menu = require('./menu')
const bcrypt = require('bcryptjs')
const autoIncrement = require('mongoose-auto-increment-fix');

// 创建用户集合规则
const userSchema = new Schema({
  //第三方授权登录的 github 的用户 id
  qq_id: { type: String, default: '' },
  // 是否删除 0 正常 1删除
  del_flag: {
    type: Number,
    default: 0
  },
  is_developer: { type: Number, default: 1 }, // 0 不可以停用，1 可以停用
  // 角色 id
  roles: {
    type: Schema.Types.ObjectId,
    ref: 'Role',
    required: true
  },
  // 用户名
  user_name: {
    type: String,
    required: true,
    minlength: 3,
    maxlength: 20,
    unique: true
  },
  //用户类型 0：博主，1：其他用户 ，2：github， 3：weixin， 4：qq ( 0，1 是注册的用户； 2，3，4 都是第三方授权登录的用户)
  user_type: { type: Number, default: 1 },
  // 用户昵称
  nick_name: {
    type: String,
    required: true
  },
  // 用户邮箱
  user_email: {
    type: String,
    unique: true
  },
  //封面
  img_url: { type: String, default: '' },
  // 手机号
  user_telephone_number: {
    type: String,
    unique: true
  },
  // 个人介绍
  introduce: { type: String, default: '' },
  // 密码
  user_password: {
    type: String,
    required: true
  },
  // 用户状态 是否禁用 0禁用  1启用，
  user_status: {
    type: Number,
    default: 1
  },

  // 用户头像
  user_avatar: {
    type: String,
    default: ''
  },
  // 登录 ip
  login_ip: {
    type: String
  },
  // 登录时间
  login_date: {
    type: Date
  },
  // 创建时间
  create_time: {
    type: Date,
    default: Date.now
  },
  // 更新时间
  update_time: {
    type: Date,
    default: Date.now
  }
}, {
  versionKey: false // 查询数据库时，忽略 _v 的字段返回
})

function mapMenu (array) {
  return array.map(item => {
    return {
      path: item.path,
      component: item.component,
      name: item.name,
      meta: item.meta,
      children: item.children,
      redirect: item.redirect,
      hiden: item.hidden,
      alwaysShow: item.alwaysShow
    }
  })
}

// 返回用户信息，包含路由菜单
userSchema.statics.findInfo = async function (userId) {
  // this 指向当前的 model
  const queryData = [{ _id: userId }, { _id: 1, user_avatar: 1, user_name: 1, nick_name: 1, roles: 1 }]
  const data = await this.findOne(...queryData).populate('roles', { menus: 1, _id: 0, role_key: 1 })
  console.log(data.roles)
  let menus = await Menu.find({ menu_id: { $in: data.roles.menus } }, { _id: false })
  // console.log(menus)
  // return
  const allMenus = await Menu.find()
  menus = JSON.parse(JSON.stringify(menus))
  // 找出一级菜单
  const leve0 = menus.filter(item => item.parent_id === 0)
  // console.log(leve0)
  // return
  // 拼接二级菜单
  leve0.forEach(L0 => {
    let obj = menus.filter(L1 => L1.parent_id === L0.menu_id)
    const isDel = allMenus.filter(L1 => L1.parent_id === L0.menu_id)
    L0.children = mapMenu(obj)
    L0.redirect = L0.children[0].path
    if (isDel.length === 1) {
      delete L0.meta
      delete L0.redirect
    }
  })
  const menuFomate = mapMenu(leve0)
  return {
    avatar: data.user_avatar,
    userName: data.user_name,
    nickName: data.nick_name,
    roleKey: data.roles.role_key,
    menus: menuFomate,
    _id: data._id,
    permissions: menus.filter(item => item.perms).map(item => item.perms)
  }
}

// userSchema.statics.findByIdAndUpdate = async function (_id, state) {

//   return await this.update({ "_id": mongoose.Types.ObjectId(_id) }, { $set: { "user_status": state } })
//   // return await this.find({ "_id": mongoose.Types.ObjectId(_id) })
// }

userSchema.statics.findUserById = async function (_id) {
  const doc = await this.findById(_id, { user_password: 0 }).populate('roles', { menus: 0 })
  return {
    username: doc.user_name,
    email: doc.user_email,
    avatar: doc.user_avatar,
    mobile: doc.user_telephone_number,
    roleName: doc.roles.role_name,
    status: doc.user_status,
    roleKey: doc.roles.role_key,
    nickname: doc.nick_name,
    roleId: doc.roles._id,
    userId: doc._id,
    isHidden: doc.is_developer,
    // roles: doc.roles._id
  }
}

// 创建集合
const User = model('User', userSchema)



// async function CreateUser (pwd) {
//   const salt = await bcrypt.genSalt(10)
//   //对密码进行加密
//   //第一个参数要进行的加密的明文
//   //2.随机字符串
//   //返回值是加密后的密码
//   const result = await bcrypt.hash('zyl1315MC', salt)
//   const user = await User.create({
//     user_name: '创始人',
//     nick_name: '正好有时间',
//     user_email: '1107361070@qq.com',
//     user_telephone_number: '14759491315',
//     user_password: result,
//     roles: '606e71b1ddf1174074ae2272'
//   })
// }
// CreateUser()

module.exports = User
